package br.com.pucrs.tcc.controller;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import org.primefaces.model.DualListModel;

import br.com.pucrs.tcc.ed.AreaInteresse;
import br.com.pucrs.tcc.ed.Professor;
import br.com.pucrs.tcc.ed.Telefone;
import br.com.pucrs.tcc.enumerator.TipoTelefoneEnum;
import br.com.pucrs.tcc.exception.ProfessorException;
import br.com.pucrs.tcc.rn.AreaInteresseRN;
import br.com.pucrs.tcc.rn.ProfessorRN;
import br.com.pucrs.tcc.util.jsf.MensagemUtil;
import br.com.pucrs.tcc.util.jsf.SessionUtil;

@ManagedBean(name = "ProfessorPerfilController")
@ViewScoped
public class ProfessorPerfilController {

	private Professor mProfessor;

	private ArrayList<AreaInteresse> mAreasInteresse;

	private DualListModel<AreaInteresse> areasInteresseModel;

	private List<AreaInteresse> areasTarget;

	@EJB
	private ProfessorRN mProfessorRN;

	@EJB
	private AreaInteresseRN mAreaInteresseRN;

	private Telefone foneResidencial;
	private Telefone foneCelular;
	private Telefone foneComercial;

	public ProfessorPerfilController() {
	}

	@PostConstruct
	public void carregaDados() {
		if (foneResidencial == null) {
			foneResidencial = new Telefone();
		}
		if (foneCelular == null) {
			foneCelular = new Telefone();
		}

		if (foneComercial == null) {
			foneComercial = new Telefone();
		}

		mProfessor = mProfessorRN.obter(SessionUtil.getMatriculaUsuarioLogado());
		System.out.println("Logado:" + SessionUtil.getMatriculaUsuarioLogado());

		if (mProfessor != null) {
			System.out.println(mProfessor.getNome());
			if (mProfessor.getTelefones() != null) {
				for (Telefone fone : mProfessor.getTelefones()) {
					System.out.println("Tipo: " + fone.getTipo());
					if (TipoTelefoneEnum.getByCodigo(fone.getTipo()).equals(TipoTelefoneEnum.RESIDENCIAL)) {
						System.out.println("REsidencial: " + fone.getNumero());
						foneResidencial = fone;
					} else if (TipoTelefoneEnum.getByCodigo(fone.getTipo()).equals(TipoTelefoneEnum.CELULAR)) {
						foneCelular = fone;
					} else {
						foneComercial = fone;
					}
				}
			}
		}

		areasTarget = mAreaInteresseRN.listaPorProfessor(mProfessor.getMatricula());
		if (areasTarget == null) {
			areasTarget = new ArrayList<AreaInteresse>();
		}
		mAreasInteresse = mAreaInteresseRN.lista();

		for (AreaInteresse area : areasTarget) {
			if (mAreasInteresse.contains(area)) {
				mAreasInteresse.remove(area);
			}
		}
		areasInteresseModel = new DualListModel<AreaInteresse>(mAreasInteresse, areasTarget);
	}

	public String removeMascara(String valor) {
		return valor.replace("(", "").replace(")", "").replace("-", "").replace(" ", "");
	}

	private void organizaTelefones() {
		fonesRemover = new ArrayList<Telefone>();
		if (foneResidencial.getNumero() != null && !foneResidencial.getNumero().equals("")) {

			foneResidencial.setNumero(removeMascara(foneResidencial.getNumero()));
			foneResidencial.setMatricula(mProfessor.getMatricula());
			foneResidencial.setTipo(TipoTelefoneEnum.RESIDENCIAL.getCodigo());

			if (foneResidencial.getId() == null || foneResidencial.getId().equals(0)) {
				mProfessor.getTelefones().add(foneResidencial);
			}

		} else {
			// se tinha, remove
			if (foneResidencial.getId() != null && !foneResidencial.getId().equals(0)) {
				// mProfessor.getTelefones().remove(foneResidencial);
				fonesRemover.add(foneResidencial);
			}
		}

		if (foneCelular.getNumero() != null && !foneCelular.getNumero().equals("")) {

			System.out.println("etrou errado");

			foneCelular.setNumero(removeMascara(foneCelular.getNumero()));
			foneCelular.setMatricula(mProfessor.getMatricula());
			foneCelular.setTipo(TipoTelefoneEnum.CELULAR.getCodigo());

			if (foneCelular.getId() == null || foneCelular.getId().equals(0)) {
				mProfessor.getTelefones().add(foneCelular);
			}

		} else {
			System.out.println("etrou certo");
			// se tinha, remove
			if (foneCelular.getId() != null && !foneCelular.getId().equals(0)) {
				// mProfessor.getTelefones().remove(foneCelular);
				fonesRemover.add(foneCelular);
			}
		}

		if (foneComercial.getNumero() != null && !foneComercial.getNumero().equals("")) {

			foneComercial.setNumero(removeMascara(foneComercial.getNumero()));
			foneComercial.setMatricula(mProfessor.getMatricula());
			foneComercial.setTipo(TipoTelefoneEnum.COMERCIAL.getCodigo());

			if (foneComercial.getId() == null || foneComercial.getId().equals(0)) {
				mProfessor.getTelefones().add(foneComercial);
			}

		} else {
			// se tinha, remove
			if (foneComercial.getId() != null && !foneComercial.getId().equals(0)) {
				// mProfessor.getTelefones().remove(foneComercial);
				fonesRemover.add(foneComercial);
			}
		}
	}

	ArrayList<Telefone> fonesRemover;

	public void salvar() {
		try {

			organizaTelefones();

			mProfessorRN.alterar(mProfessor, fonesRemover, areasTarget);

			// Reinicia o componente
			mAreasInteresse = mAreaInteresseRN.lista();
			for (AreaInteresse area : areasTarget) {
				if (mAreasInteresse.contains(area)) {
					mAreasInteresse.remove(area);
				}
			}
			areasInteresseModel.setSource(mAreasInteresse);
			areasInteresseModel.setTarget(areasTarget);

			MensagemUtil.mostraMensagemSucesso("Perfil alterado com sucesso.");
		} catch (ProfessorException ex) {
			MensagemUtil.mostraMensagemErro(ex.getMessage());
		} catch (Exception ex) {
			MensagemUtil.mostraMensagemFatal(ex.getMessage());
			ex.printStackTrace();
		}
	}

	public Professor getProfessor() {
		return mProfessor;
	}

	public void setProfessor(Professor mProfessor) {
		this.mProfessor = mProfessor;

	}

	public ArrayList<AreaInteresse> getAreasInteresse() {
		return mAreasInteresse;
	}

	public void setAreasInteresse(ArrayList<AreaInteresse> mAreasInteresse) {
		this.mAreasInteresse = mAreasInteresse;
	}

	public DualListModel<AreaInteresse> getAreasInteresseModel() {
		return areasInteresseModel;
	}

	public void setAreasInteresseModel(DualListModel<AreaInteresse> areasInteresseModel) {
		System.out.println("entrou audniasd");
		this.areasTarget = areasInteresseModel.getTarget();
	}

	public Telefone getFoneResidencial() {
		return foneResidencial;
	}

	public void setFoneResidencial(Telefone foneResidencial) {
		this.foneResidencial = foneResidencial;
	}

	public Telefone getFoneCelular() {
		return foneCelular;
	}

	public void setFoneCelular(Telefone foneCelular) {
		this.foneCelular = foneCelular;
	}

	public Telefone getFoneComercial() {
		return foneComercial;
	}

	public void setFoneComercial(Telefone foneComercial) {
		this.foneComercial = foneComercial;
	}

}
